#include "CTF1.h"

CTF1_T* CTF1_t;



//************************************
// Method:    	CALCU_SAMA						//< SAMA运算函数
// Programmer:  duan
// Time:		2019/03/19
// Returns:   	bool							//< 成功：true；失败：false
// Parameter: 	Model_Base_t * arg				//< 模块参数结构体指针
// Parameter: 	float dt						//< 运算周期
// Parameter: 	bool * DI						//< 数字量输入值数组指针
// Parameter: 	bool * DO						//< 数字量输出值数组指针
// Parameter: 	bool * AI						//< 模拟量输入值数组指针
// Parameter: 	bool * AO						//< 模拟量输出值数组指针
//************************************
bool CALCU_SAMA(CTF1)(Model_Base_t* arg, float dt, bool* DI, bool* DO, float* AI, float* AO)
{
	int i = 0;

	/****************变量定义区开始**************/
	/*<<<<<定义输入变量>>>>>*/
	float defAI;			            
	
	/*<<<<<定义输出变量>>>>>*/
	float Output_Value;			     
	
	/*<<<<<定义参数变量>>>>>*/
	float K;							//< 比例系数
	int   N;							//< 阶次
	float Init_Value = 0.0f;			//< 初始值
	float b[20];						//< 分子系数序列   bn----b0
	float a[20];						//< 分母系数序列   an----a0,且an不可为0
	

	//float BO;   上位之前上传的 bn      
	//int  N;     上位之前上传的 阶次      现将其正式加入可调参数结构体 


	/*<<<<<定义中间变量>>>>>*/
	float* x[20];
	float* last_x[20];
	
	/****************变量定义区结束**************/

	NAME(CTF1)* Obj = (NAME(CTF1)*)arg;

	/****************变量赋值**************/
	/*<<<<<输入变量赋值>>>>>*/
	defAI = AI[0];
	
	/*<<<<<参数变量赋值>>>>>*/
	 K = Obj->Par.K;      
	 N = Obj->Par.N;
	 Init_Value = Obj->Par.Init_Value;
	 
	 for (i = 0; i < 20; i++)
	 {
		 b[i] = Obj->Par.b[i];
		 a[i] = Obj->Par.a[i];
	 }

	/*<<<<<中间变量赋值>>>>>*/
	 for (i = 0; i < 20; i++)
	 {
		 x[i] = &(Obj->Sta.x[i]);
		 last_x[i] = &(Obj->Sta.last_x[i]);
	 }
		
	/**************变量赋值结束************/

	/**************算法功能实现开始**************/
	/*****************欧拉法*********************/

	 for (i = 0; i < N - 1; i++)
		 x[i][0] = last_x[i][0] + dt * (-a[i + 1] / a[0] * last_x[0][0] + last_x[i + 1][0]) + dt * K * (b[i + 1] - b[0] * a[i + 1] / a[0])* defAI;
	 
	 x[N - 1][0] = last_x[N - 1][0] + dt * (-a[N] / a[0] * last_x[0][0]) + dt * K * (b[N] - b[0] * a[N] / a[0] )* defAI;
	 
	  for (i = 0; i < N; i++)
		  last_x[i][0] = x[i][0];

	  Output_Value = 1 / a[0] * x[0][0] + K * b[0] / a[0] * defAI + Init_Value;		

	/**************算法功能实现结束**************/
		
	/****************运算结果输出**************/
	  AO[0] = Output_Value;
	//< printf("连续传函模块的输出值为%f \r\n", AO[0]);     duan0827
	/**************运算结果输出完毕************/
	return true;
}



//************************************
// Method:    	BCPARA							//< 广播SAMA参数变量函数（无参数需要广播的模块直接将BCPara函数设置为NULL即可）
// Programmer:  duan
// Time:		2018/11/16
// Returns:   	int								//< 成功：返回打包字节个数；失败：返回0
// Parameter: 	Model_Base_t * arg				//< 模块参数结构体指针
// Parameter: 	void ** Data					//< 广播SAMA参数的数据包的指针
//************************************
int BC_PARA(CTF1)(Model_Base_t* arg, void** Data)
{
	NAME(CTF1)* Obj = (NAME(CTF1)*)arg;
	BC_PARA_PUBLIC(Obj);
	return 0;
}



//************************************
// Method:    	BAK_STA							//< 备份SAMA运算中间参数
// Programmer:  duan
// Time:		2018/11/16
// Returns:   	int								//< 成功：返回打包字节个数；失败：返回0
// Parameter: 	Model_Base_t * arg				//< 指定模块类型链表的指针
// Parameter: 	void ** Data					//< 存放数据包当前指针位置的地址
//************************************
int BAK_STA(CTF1)(Model_Base_t* arg, void** Data)
{
	NAME(CTF1)* Obj = (NAME(CTF1)*)arg;
	BAK_STA_PRIVATE(Obj);
	return 0;
}



//************************************
// Method:    	ANA_STA							//< 解析备份的SAMA运算中间参数
// Programmer:  duan
// Time:		2019/03/19
// Returns:   	int								//< 成功：返回解析字节个数；失败：返回0
// Parameter: 	Model_Base_t * arg				//< 模块参数结构体指针
// Parameter: 	void ** Data					//< 存放数据包当前指针位置的地址
//************************************
int ANA_STA(CTF1)(Model_Base_t* arg, void** Data)
{
	NAME(CTF1)* Obj = (NAME(CTF1)*)arg;
	ANA_STA_PRIVATE(Obj);
	return 0;
}



//************************************
// Method:    	CHANGE_PAR				//< 在线修改模块参数函数
// Programmer:  duan
// Time:		2019/03/19
// Returns:   	int						//< 读取字节长度计数值
// Parameter: 	Model_Base_t* arg		//< 指定模块类型链表的指针
// Parameter: 	void** Data				//< 存放数据包当前指针位置的地址
//************************************
int CHANGE_PAR(CTF1)(Model_Base_t* arg, void** Data)
{
	int _iLen = 0;
	MEMREAD(((NAME(CTF1)*)arg)->Par, Data[0]);
	return _iLen;
}



//************************************
// Method:    	INIT_STAPAR						//< 初始化模块运算中间参数
// Programmer:  duan
// Time:		2019/03/19
// Parameter: 	Model_Base_t* arg				//< 模块参数结构体指针
//************************************
void INIT_STAPAR(CTF1)(Model_Base_t* arg)
{
	NAME(CTF1)* name = (NAME(CTF1)*)arg;
	/****************初始化中间变量结构体**************/
	memset(&(name->Sta), 0, sizeof(name->Sta));
	/**************初始化中间变量结构体结束************/

	/****************对中间变量结构体的相关参数进行赋值**************/

	/**************对中间变量结构体的相关参数进行赋值结束************/
}
